package config

import (
	"github.com/spf13/viper"
	"log"
	"os"
	"path"
)

const (
	KEY_GINFWK_ENV = "GINFWK_ENV"

	CONFIG_DEV_PATH  = "./server/config/config-dev.yaml"
	CONFIG_TEST_PATH = "./server/config/config-test.yaml"
	CONFIG_PROD_PATH = "./server/config/config-release.yaml"

	CONFIG_ENV_DEV  = "dev"
	CONFIG_ENV_TEST = "test"
	CONFIG_ENV_PROD = "prod"
)

var configEnvMap = map[string]string{
	CONFIG_ENV_DEV:  CONFIG_DEV_PATH,
	CONFIG_ENV_TEST: CONFIG_TEST_PATH,
	CONFIG_ENV_PROD: CONFIG_PROD_PATH,
}

var (
	root_dir   = ""
	ConfigFile = "" // 配置文件路径
)

var globalConfig *Config

func Global() *Config {
	return globalConfig
}

func Init() {
	// 实例化配置类
	globalConfig = &Config{}

	// 解析配置到配置类
	configPath := getConfigFile()
	configParse(globalConfig, configPath)
}

func SetRootDir(dir string) {
	root_dir = dir
}

// GetRootDir 获取项目工作根目录
func GetRootDir() string {
	return root_dir
}

// configParse
// 解析配置文件
func configParse(cfg *Config, configPath string) {
	v := viper.New()
	v.SetConfigFile(configPath)
	v.SetConfigType("yaml")
	err := v.ReadInConfig()
	if err != nil {
		log.Fatalf("Fatal error config file: %s \n", err)
	}
	if err = v.Unmarshal(cfg); err != nil {
		log.Fatalf("Fatal error parse config failed, %s \n", err)
	}
}

// getConfigFile
// 获取配置文件路径
func getConfigFile() string {
	var (
		configType string // 配置类型
		configEnv  string // 配置环境变量
	)

	// 判断命令行参数是否为空
	if ConfigFile != "" {
		// 命令行参数-c
		configType = "命令行参数:-c"
	} else {
		configType = "环境变量:" + KEY_GINFWK_ENV
		configEnv = os.Getenv(KEY_GINFWK_ENV)
		if configEnv == "" {
			configEnv = CONFIG_ENV_DEV
		}
		if configPath, ok := configEnvMap[configEnv]; ok {
			if localRootDir := GetRootDir(); len(localRootDir) != 0 {
				configPath = path.Join(localRootDir, configPath)
			}
			ConfigFile = configPath
		} else {
			log.Fatalf("请使用'命令行参数-c'或者'系统变量[%s]'指定配置环境/文件!\n", KEY_GINFWK_ENV)
		}
	}
	log.Printf("配置方式:[%s] 配置文件:[%s]\n", configType, ConfigFile)
	return ConfigFile
}
